Attribute VB_Name = "modStringRef"
'***************************************************************
' (c) Copyright 2000 Matthew J. Curland
'
' This file is from the CD-ROM accompanying the book:
' Advanced Visual Basic 6: Power Techniques for Everyday Programs
'   Author: Matthew Curland
'   Published by: Addison-Wesley, July 2000
'   ISBN: 0-201-70712-8
'   http://www.PowerVB.com
'
' You are entitled to license free distribution of any application
'   that uses this file if you own a copy of the book, or if you
'   have obtained the file from a source approved by the author. You
'   may redistribute this file only with express written permission
'   of the author.
'
' This file depends on:
'   References:
'     VBoostTypes6.olb (VBoost Object Types (6.0))
'     VBoost6.Dll (VBoost Object Implementation (6.0)) (optional)
'   Files:
'     VBoost.Bas (optional)
'   Minimal VBoost conditionals:
'     VBOOST_INTERNAL = 1 : VBOOST_CUSTOM = 1
'   Conditional Compilation Values:
'     NOVBOOST = 1 'Removes VBoost dependency
'
' This file is discussed in Chapter 14.
'***************************************************************
Option Explicit

Private Type StringRefVTable
    VTable(2) As Long
End Type

Private m_VTable As StringRefVTable
Private m_pVTable As Long

Public Type StringRef
    pVTable As Long
    pThisObject As IUnknown
    Ref As String
End Type

Public Sub InitStringRef(SR As StringRef, ByVal pString As Long)
    If m_pVTable = 0 Then
        With m_VTable
            .VTable(0) = FuncAddr(AddressOf QueryInterface)
            .VTable(1) = FuncAddr(AddressOf AddRef)
            .VTable(2) = FuncAddr(AddressOf Release)
            m_pVTable = VarPtr(.VTable(0))
        End With
    End If
    
    With SR
        .pVTable = m_pVTable
        #If NOVBOOST Then
            CopyMemory .pThisObject, VarPtr(.pVTable), 4
            CopyMemory ByVal VarPtr(.Ref), pString, 4
        #Else
            VBoost.Assign .pThisObject, VarPtr(.pVTable)
            VBoost.Assign .Ref, pString
        #End If
    End With
End Sub

Private Function QueryInterface(This As StringRef, riid As Long, pvObj As Long) As Long
    Debug.Assert False 'QI not expected
    pvObj = 0
    QueryInterface = E_NOINTERFACE
End Function
Private Function AddRef(This As StringRef) As Long
    Debug.Assert False 'No need to addref
End Function
Private Function Release(This As StringRef) As Long
    'Clear the string pointer before VB gets hold of it.
    #If NOVBOOST Then
        CopyMemory ByVal VarPtr(This.Ref), 0&, 4
    #Else
        VBoost.AssignZero This.Ref
    #End If
End Function
Private Function FuncAddr(ByVal pfn As Long) As Long
    FuncAddr = pfn
End Function

